﻿// 0730train01.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>
#include <sstream>
#include <stack>
#include <vector>
#include <algorithm>
#include <limits.h>

using namespace std;

/*
 在学校中，N个小朋友站成一队， 第i个小朋友的身高为height[i]，第i个小朋友可以看到的右边的第一个比自己身高更高的小朋友j，那么j是i的好朋友（j > i）。请重新生成一个列表，对应位置的输出是每个小朋友的好朋友位置，如果没有看到好朋友，请在该位置用0代替。小朋友人数范围是 [0, 40000]。
输入描述
第一行输入N，表示有N个小朋友
第二行输入N个小朋友的身高height[i]，都是整数

输出描述
输出N个小朋友的好朋友的位置


输入
2
100 95

输出
0 0

输入
8
123 124 125 121 119 122 126 123

输出
1 2 6 5 5 6 0 0

 */

void solve01(vector<int>&oh_vec)
{
    int oh_vec_size = oh_vec.size();
    stack<int>oh_stack;
    vector<int>result_vec(oh_vec_size); //记得数组初始化

    for (int i=oh_vec_size-1; i>=0; i--)
    {
        int curr_num = oh_vec[i];
        while (!oh_stack.empty() && oh_vec[oh_stack.top()] <= curr_num)
        {
            oh_stack.pop();
        }

        if (!oh_stack.empty())
        {
            result_vec[i] = oh_stack.top();
        }
        oh_stack.push(i);
    }

    for (auto&item: result_vec)
    {
        cout << item << ' ';
    }

    //solve01
    //------
}


/*
n盘寿司，prices[i]是第 i 盘寿司的价格，选择了第 i，免费赠送客户距离第 i 最近的 j，
前提是prices[j] < prices[i]，如果没有满足条件的 j，则不赠送寿司。
每个价格的寿司都可无限供应。

输入描述
输入的每一个数字代表每盘寿司的价格，每盘寿司的价格之间使用空格分隔
寿司的盘数 n范围为: 1 <= n <= 500
输出享受优惠后的一组数据，每个值表示i 实际总价格

输入
3 15 6 14
输出
3 21 9 17


 */

void solve02(vector<int>& prices)
{
    int prices_size = prices.size();
    stack<int>oh_stack;
    int oh_vec_size = prices_size * 2;

    vector<int>result_vec(oh_vec_size);
    vector<int>oh_vec(oh_vec_size);

    for (int i=0; i< oh_vec_size;i++)
    {
        if (i<prices_size)
        {
            result_vec[i] = prices[i];
            oh_vec[i] = result_vec[i];
        }
        else
        {
            result_vec[i] = prices[i- prices_size];
            oh_vec[i] = result_vec[i];
        }
    }

    for (int i=oh_vec_size-1;i>=0; i--)
    {
        int curr_num = oh_vec[i];
        while (!oh_stack.empty() && oh_stack.top() >= curr_num)
        {
            oh_stack.pop();
        }

        if (!oh_stack.empty())
        {
            int next_num = oh_stack.top();
            result_vec[i] = curr_num + next_num;
        }
        oh_stack.push(curr_num);
    }

    for (int i=0;i<prices_size;i++)
    {
        cout << result_vec[i] << ' ';
    }

    //solve02
    //------
}


/*
 给一个正整数 NUM1，计算出新正整数 NUM2。
 NUM2 为 NUM1 中移除 N 位数字后的结果，
 需要使得 NUM2 的值最小。

输入
1. 输入的第一行为一个字符串，字符串由 0-9 字符组成，记录正整数 NUM1，NUM1 长度小于 32。
2. 输入的第二行为需要移除的数字的个数，小于 NUM1 长度。
输出
输出一个数字字符串，记录最小值 NUM2。

输入
2615371
4
输出
131

移除 2、6、5、7 这四个数字，剩下 1、3、1 按原有顺序排列组成 131 为最小值。

 */

void solve03(vector<int>oh_vec, int target)
{
    vector<int>oh_stack_vec;
    int op_count = target;
    int oh_vec_size = oh_vec.size();

    for (int i=0; i< oh_vec_size; i++)
    {
        int curr_num = oh_vec[i];
	    while (!oh_stack_vec.empty() && 
            op_count>0 && 
            oh_stack_vec[oh_stack_vec.size()-1]>curr_num)
	    {
            oh_stack_vec.pop_back();
            op_count -= 1;
	    }
        oh_stack_vec.push_back(curr_num);
    }

    int result_size = oh_vec_size - target;
    vector<int>result_vec(result_size);
    for (int i=0; i<result_size; i++)
    {
        result_vec[i] = oh_stack_vec[i];
    }
    

    for (auto&item: result_vec)
    {
        cout << item;
    }

	//solve03
    //------
}


int main()
{

	{
        //string input = "12345";
        //int target = 2;
        //12345 2
        
        string input, target;
        cin >> input >> target;

        vector<int>oh_vec;

        for (auto &oh_char:input)
        {
            int curr_num = oh_char - '0';
            oh_vec.push_back(curr_num);
        }

        solve03(oh_vec, stoi(target));

        return 0;
	}

	{
        string input;
        getline(cin, input);
        stringstream oh_sstream(input);
        string token;
        vector<int>oh_vec;
        while (oh_sstream >>token)
        {
            oh_vec.push_back(stoi(token));
        }

        //for (auto&item:oh_vec)
        //{
        //    cout << item;
        //}

        //vector<int>oh_vec = { 3,15,6,14 };
        solve02(oh_vec);
        return 0;
	}


    //vector<int>oh_vec = { 123,124,125,121,119,122,126,123 };

    int oh_vec_size;
    cin >> oh_vec_size;
    vector<int>oh_vec(oh_vec_size);
    for (int i=0; i<oh_vec_size; i++)
    {
        cin >> oh_vec[i];
    }

    //for (auto&item:oh_vec)
    //{
    //    cout << item << ' ';
    //}

    solve01(oh_vec);
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
